package yc.web.filter;

import redis.clients.jedis.Jedis;
import yc.bean.User;
import yc.dao.RedisHelper;
import yc.utils.YcConstants;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Calendar;

@WebFilter(filterName = "AddictedUsersFilter",value = "/user.action")

public class AddictedUsersFilter extends CommonFilter{
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(req,resp);
        //只针对 login操作 的响应上做处理，判断是否成功
        HttpServletRequest request= (HttpServletRequest) req;
        String op=request.getParameter("op");
        if ("login".equals(op)){
            //说明是login操作
            //如果登录成功，在session中一定有 reuser 一个attribute
            HttpSession session=request.getSession();
            if (session.getAttribute(YcConstants.REUSER) != null){
                //登录成功 -》取出今天是周几，存到redis中去
                User user=(User) session.getAttribute(YcConstants.REUSER);
                long uid=user.getUserid();
                Jedis jedis= RedisHelper.getRedisInstance();
                //业务：取出服务器的时间，周几，作为键来存
                int weekday= Calendar.getInstance().get(Calendar.DAY_OF_WEEK);//周日是1 周六是7
                jedis.setbit(weekday+"",uid,true);//将uid这一位设置为 1
                jedis.close();
                //TODO:这里的问题，1.如果到了下一周了 这个 weekday中的数据是如何情空的？需要一个定时器 定点24:00 清空倒数第七天的记录来执行
                //定时器：这里是一个后台java端的定时器， 可以用java.util中的Timer+TimerTask来完成.这个实际就是一个线程
                //问题是：这个线程类什么时候启动呢？？-》放 到一个监听器（ApplicationContextListener）监听服务器启动 这个类的业务怎么实现的呢？
                //2.如何计算 连续七天到登录的用户 bitop and x1 x2 x3
                //3.什么地方要用到上面的计算结果（系统管理员的后台） 如何取出 计算的结果bitop的返回值为long类型
                //                                                     将long转为二进制数据，按位取数据即可。

            }
        }

    }
}
